package com.edu.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @Author:mx
 * @Date:2025/11/14-9:33:36
 */
@Component
@Aspect
@Order(2)
public class MyAdvise {

    /*
    *       在一个 空方法 上 加上 @Pointcut 表示定义一个切点。
    *       切点的名字 就是 方法名
    * */
    @Pointcut("execution(public * com.edu.service..*.*(..))")
    public void pt1(){

    }



    /*
    *       @Before 用于配置 前置通知 方法
    *           @Before("切点表达式/切点()")
    * */
    @Before("pt1()")
    public void beforeAdvise(JoinPoint jt){
        System.out.println("执行了前置通知");
    }


    @AfterReturning(pointcut = "pt1()",returning = "result")
    public void afterReturnAdvise(JoinPoint jt,Object result){
        System.out.println("原始业务方法返回值为:"+result);
        System.out.println("执行了后置返回通知");
    }

    @AfterThrowing(pointcut = "pt1()",throwing = "e")
    public void afterThrowAdvise(JoinPoint jt,Exception e){
        System.out.println(e);
        System.out.println("执行了异常通知");
    }

    @After("pt1()")
    public void after(JoinPoint jt){
        System.out.println("执行了后置通知");
    }

    @Around("pt1()")
    public Object aroundAdvise(ProceedingJoinPoint pjt){
        System.out.println("执行了环绕通知前置");
        Object re = null;
        try {
            re = pjt.proceed();//执行原始业务方法
            //
        } catch (Throwable e) {
            e.printStackTrace();
            //
        }
        System.out.println("执行了环绕通知后置");
        return re;
    }

}
